home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1995 April / Internet Tools.iso / x25 / nrs.shar.Z / nrs.shar / config.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-04-27  |  15.3 KB  |  696 lines

  1. # include    "nrs.h"
  2.  
  3. # ifndef lint
  4. static char RCSid[]="@(#)$Header: config.c,v 3.6 88/09/08 17:38:31 pb Exp $";
  5. # endif
  6.  
  7. /***********************************************************************\
  8. *                                     *
  9. * The routines to read the config file, set up the tables, and keep    *
  10. * everybody happy (some hope)                            *
  11. *                                     *
  12. * Copyright 1986, Piete Brooks, Julian Onions & Adrian Pell        *
  13. * pb@cl.cam.ac.uk, jpo@hcig.nott.ac.uk, Adrian.R.Pell@reading.ac.uk    *
  14. *                                    *
  15. * This program may be copied as long as you don't remove this notice,    *
  16. * try to make any money off of it, or pretend that you wrote it.    *
  17. *                                     *
  18. \***********************************************************************/
  19.  
  20. # define    C_VERBOSE    1
  21. # define    C_FILE        2
  22. # define    C_OUTPUT    3
  23. # define    C_M2        4
  24. # define    C_M3        5
  25. # define    C_M4        6
  26. # define    C_FILEDMN    7
  27. # define    C_FILECHAN    8
  28. # define    C_GATEWAY    9
  29. # define    C_DIRECTORY    10
  30. # define    C_RELAYHOST    12
  31. # define    C_COMMENT    13
  32. # define    C_HOSTNAME    14
  33. # define    C_DERFIL    15
  34. # define    C_CONTEXT    16
  35. # define    C_DOMAIN    17
  36. # define    C_LEVEL        18
  37.  
  38. Lookup    conftab[] = {    /* table of config strings */
  39.     "verbose",     C_VERBOSE,
  40.     "file",        C_FILE,
  41.     "output",    C_OUTPUT,
  42.     "module2",    C_M2,
  43.     "module3",    C_M3,
  44.     "module4",    C_M4,
  45. #ifdef    MULT_OUTPUT_FILES
  46.     "filedmn",    C_FILEDMN,
  47.     "filechan",    C_FILECHAN,
  48. #endif    MULT_OUTPUT_FILES
  49.     "gateway",    C_GATEWAY,
  50.     "directory",    C_DIRECTORY,
  51. #ifdef    MULT_OUTPUT_FILES
  52.     "relay_host",    C_RELAYHOST,
  53. #endif    MULT_OUTPUT_FILES
  54.     "comment",    C_COMMENT,
  55.     "hostname",    C_HOSTNAME,
  56.     "derfil",    C_DERFIL,
  57.     "context",    C_CONTEXT,
  58.     "domains",    C_DOMAIN,
  59.     "level",    C_LEVEL,
  60.     0,        0,
  61. };
  62.  
  63. /* defines for output types */
  64. # define    YORK        1
  65. # define    X25HOSTS    2
  66. # define    MMDF        3
  67. # define    TEXT        4
  68. # define    SMAIL        5
  69. # define    VMS5        6
  70. # define    SENDMAIL    7
  71. # define    YORK21        8
  72. # define    DBM1        9
  73. # define    PRIME        10
  74. # define    EDTEXT        11
  75. # define    VME        12
  76. # define    VMS4        13
  77. # define    PP        14
  78.  
  79. /* Define the current type */
  80. # define    M_YORK        (1 << YORK)
  81. # define    M_X25HOSTS    (1 << X25HOSTS)
  82. # define    M_MMDF        (1 << MMDF)
  83. # define    M_TEXT        (1 << TEXT)
  84. # define    M_SMAIL        (1 << SMAIL)
  85. # define    M_VMS5        (1 << VMS5)
  86. # define    M_SENDMAIL    (1 << SENDMAIL)
  87. # define    M_YORK21    (1 << YORK21)
  88. # define    M_DBM1        (1 << DBM1)
  89. # define    M_PRIME        (1 << PRIME)
  90. # define    M_EDTEXT    (1 << EDTEXT)
  91. # define    M_VME        (1 << VME)
  92. # define    M_VMS4        (1 << VMS4)
  93. # define    M_PP        (1 << PP)
  94.  
  95. Lookup    outputs[] = {    /* config to internal map */
  96.     "york",        YORK,
  97.     "x25hosts",    X25HOSTS,
  98.     "mmdf",        MMDF,
  99.     "text",        TEXT,
  100.     "smail",    SMAIL,
  101.     "vms",        VMS5,
  102.     "sendmail",    SENDMAIL,
  103.     "york2.1",    YORK21,
  104.     "dbm1",        DBM1,
  105.     "york2.2",    YORK,
  106.     "ucl",        DBM1,
  107.     "prime",    PRIME,
  108.     "edtext",    EDTEXT,
  109.     "vme",        VME,
  110.     "vms5",        VMS5,
  111.     "vms4",        VMS4,
  112.     "pp",        PP,
  113.     0,        0,
  114. };
  115.  
  116. # define    G_PSS    1
  117. # define    G_JANET    2
  118.  
  119. Lookup    gateways[] = {
  120.     "janet",    G_JANET,
  121.     "pss",        G_PSS,
  122.     0,        0,
  123. };
  124.  
  125. Lookup    outputkeys[] = {    /* table of keys for output strings */
  126.     "long",        LONG,
  127.     "standard",    LONG,
  128.     "short",    SHORT,
  129.     "abbreviated",    SHORT,
  130.     "forward",    FORWARD,
  131.     "reverse",    REVERSE,
  132.     "mixed",    MIXED,
  133.     "lower",    LOWER,
  134.     "ignorerelay",    IGNORERELAY,
  135.     0,        0,
  136. };
  137.  
  138. int format_mask;
  139.  
  140. static_f int split();
  141. static_f void doconfig();
  142. static_f void enablefile();
  143. static_f void enablecontext();
  144. static_f void setoutput();
  145. static_f void file_dmn();
  146. static_f void file_chan();
  147. static_f void setgateway();
  148. static_f void config_check();
  149.  
  150. void
  151. config(av, n)    /* process cfile and extract config info */
  152. char    **av;
  153. int    n;
  154. {
  155.     register char *cp1, *cp2;
  156.     FILE    *fp;
  157.     char    buffer[BUFSIZ];
  158.     int    i;
  159.  
  160.     if((fp = fopen(*av, "r")) != NULL)
  161.     {
  162.         while(fgets(buffer, sizeof buffer, fp) != NULL)
  163.             doconfig(buffer);
  164.         VOID fclose(fp); /* we're desparately short on fd's */
  165.         av ++; n --;
  166.     }
  167.     for( i = 0; i < n; i++)
  168.     {
  169.         cp2 = *av;
  170.         while(*cp2)
  171.         {
  172.             for( cp1 = buffer; *cp2 && *cp2 != '\n'; cp2++)
  173.                 *cp1 ++ = *cp2;
  174.             if( *cp2 == '\n')
  175.                 cp2 ++;
  176.             *cp1 = '\0';
  177.             doconfig(buffer);
  178.         }
  179.         av ++;
  180.     }
  181.     config_check();
  182. }
  183.  
  184. static_f void
  185. doconfig(line)
  186. char    *line;
  187. {
  188.     char    *argv[100], **av;
  189.     int    argc;
  190.     int    getout;
  191.  
  192.     if( line[0] == '\n' || line[0] == '#' || line[0] == '\0')
  193.         return;
  194.     argc = split(line, argv, sizeof argv / sizeof argv[0]);
  195.     av = argv;
  196.     switch( slookup(*av, conftab) )
  197.     {
  198.         case    C_FILE:    /* an atomic file */
  199.             enablefile(++av, argc-1);
  200.             usederfil = 0;
  201.             break;
  202.         case    C_CONTEXT: /* a required context */
  203.             enablecontext(++av, argc-1);
  204.             usederfil = 1;
  205.             break;
  206.         case    C_OUTPUT: /* output format */
  207.             getout = 0;
  208.             for (; !getout && argc > 1; argc--)
  209.                 switch (slookup(*++av, outputkeys))
  210.                 {
  211.                 case LONG:    longshort = LONG;    break;
  212.                 case SHORT:    longshort = SHORT;    break;
  213.                 case REVERSE: forwrev = REVERSE;    break;
  214.                 case FORWARD: forwrev = FORWARD;    break;
  215.                 case MIXED: mixlow = MIXED;        break;
  216.                 case LOWER: mixlow = LOWER;        break;
  217.                 case IGNORERELAY: ignore_relay++;    break;
  218.  
  219.                 default:    argc++; getout=1;    break;
  220.                 }
  221.             if (argc > 1) setoutput(av, argc-1);
  222.             break;
  223.         case    C_VERBOSE: /* set verbose */
  224.             if( argc > 1 )
  225.                 verbose = atoi(*++av);
  226.             else verbose = 1;
  227.             break;
  228.         case    C_LEVEL: /* set verbose */
  229.             if( argc > 1 )
  230.                 max_warns = atoi(*++av);
  231.             else max_warns = 1;
  232.             break;
  233.         case    C_M2: /* module 2 file name */
  234.             if( M2file )
  235.                 free(M2file);
  236.             M2file = getfpath(*++av);
  237.             usederfil = 0;
  238.             break;
  239.         case    C_M3:
  240.             if( M3file )
  241.                 free(M3file);
  242.             M3file = getfpath(*++av);
  243.             usederfil = 0;
  244.             break;
  245.         case    C_M4: /* module 4 file name */
  246.             if( M4file )
  247.                 free(M4file);
  248.             M4file = getfpath(*++av);
  249.             usederfil = 0;
  250.             break;
  251.         case    C_DOMAIN: /* domains file name */
  252.             if( DOMfile )
  253.                 free(DOMfile);
  254.             /* hmmm may be a real file name or missing ... */
  255.             DOMfile = getfpath((argc > 1) ? *++av : "/junk-domain");
  256.             break;
  257.         case    C_DERFIL: /* derived file name */
  258.             if( Derfile )
  259.                 free(Derfile);
  260.             Derfile = getfpath(*++av);
  261.             usederfil = 1;
  262.             break;
  263. # ifdef    MULT_OUTPUT_FILES
  264.         case    C_FILEDMN: /* info on domains */
  265.             file_dmn(++av, argc - 1);
  266.             break;
  267.         case    C_FILECHAN:    /* info on chans */
  268.             file_chan(++av, argc - 1);
  269.             break;
  270.  
  271.         case    C_RELAYHOST:
  272.             if( argc < 2)
  273.                 warn0(1, "No relay host given");
  274.             else
  275.             {
  276.                 if( relay_host )
  277.                     free( relay_host);
  278.                 relay_host = strdup(*++av);
  279.             }
  280.             break;
  281. # endif MULT_OUTPUT_FILES
  282.         case    C_GATEWAY:
  283.             setgateway(++av, argc -1);
  284.             break;
  285.         case    C_DIRECTORY:
  286.             if( argc < 2)
  287.                 warn0(1, "directory needs an argument");
  288.             else
  289.             {
  290.                 if( directory )
  291.                     free( directory);
  292.                 directory = strdup(*++av);
  293.             }
  294.             break;
  295.  
  296.         case    C_HOSTNAME:
  297.             if( argc < 2)
  298.                 warn0(1, "No hostname value given");
  299.             else
  300.             {
  301.                 if( hostname)
  302.                     free(hostname);
  303.                 hostname = strdup(*++av);
  304.             }
  305.             break;
  306.  
  307.         case    C_COMMENT:
  308.             if( argc < 2)
  309.                 warn0(1, "No comment file");
  310.             else
  311.             {
  312.                 if( commentfile)
  313.                     free(commentfile);
  314.                 commentfile = strdup(*++av);
  315.             }
  316.             break;
  317.         default:
  318.             warn1(1, "Unknown option %s", *av);
  319.             break;
  320.     }
  321. }
  322.  
  323. static_f void
  324. enablefile(av, n) /* set up file name and context/network info */
  325. char    **av;
  326. int    n;
  327. {
  328.     Table    *tp;
  329.  
  330.     if( n < 3)
  331.     {
  332.         warn1(1, "file %s - line badly formed", *av);
  333.         return;
  334.     }
  335.     /* find next empty slot ... */
  336.     for( tp = tablist; tp->T_name != NULL; tp++)
  337.         ;
  338.     if( tp - tablist > MAXTABLES)
  339.         fatal1("Too many files on %s", *av);
  340.     tp->T_name = getfpath(*av); /* ... and store it */
  341.     if((tp->T_context = slookup(*++av, contexts)) == -1)
  342.         fatal1("context %s not found", *av);
  343.     if((tp->T_network = slookup(*++av, netnames)) == -1)
  344.         fatal1("network %s not found", *av);
  345.     if (n > 3)
  346.     {    if((tp->T_direction = slookup(*++av, directions)) == -1)
  347.             fatal1("direction %s not found", *av);
  348.     }
  349.     else    tp->T_direction = DIR_FORWARDS;
  350. }
  351.  
  352. static_f void
  353. enablecontext(av, n) /* set up context/network info */
  354. char    **av;
  355. int    n;
  356. {
  357.     Table    *tp;
  358.  
  359.     if( n < 2)
  360.     {
  361.         warn1(1, "context %s - line badly formed", *av);
  362.         return;
  363.     }
  364.     /* find next empty slot ... */
  365.     for( tp = tablist; tp->T_name != NULL; tp++)
  366.         ;
  367.     if( tp - tablist > MAXTABLES)
  368.         fatal0("Too many files");
  369.     tp->T_name = ""; /* ... and store it */
  370.     if((tp->T_context = slookup(*av, contexts)) == -1)
  371.         fatal1("context %s not found", *av);
  372.     if((tp->T_network = slookup(*++av, netnames)) == -1)
  373.         fatal1("network %s not found", *av);
  374.     if (n > 2)
  375.     {    if((tp->T_direction = slookup(*++av, directions)) == -1)
  376.             fatal1("direction %s not found", *av);
  377.     }
  378.     else    tp->T_direction = DIR_FORWARDS;
  379. }
  380.  
  381. static_f void
  382. setoutput(av, n) /* how do we want to see the results? */
  383. char    **av;
  384. int    n;
  385. {
  386.     switch(slookup(*av, outputs))
  387.     {
  388. # ifdef    F_YORK
  389.         case    YORK:
  390.             format_mask = M_YORK;
  391.             outputformat = yorkformat;
  392.             break;
  393. # endif    F_YORK
  394. # ifdef    F_SMAIL
  395.         case    SMAIL:
  396.             format_mask = M_SMAIL;
  397.             outputformat = smailformat;
  398.             break;
  399. # endif    F_SMAIL
  400. # ifdef    F_X25HOSTS
  401.         case    X25HOSTS:
  402.             format_mask = M_X25HOSTS;
  403.             outputformat = x25hostsformat;
  404.             if( --n > 0)
  405.             {
  406.                 if( stripoff)
  407.                     free(stripoff);
  408.                 stripoff = strdup(*++av);
  409.             }
  410.             break;
  411. # endif    F_X25HOSTS
  412. # ifdef    F_MMDF
  413.         case    MMDF:
  414.             format_mask = M_MMDF;
  415.             outputformat = mmdfformat;
  416.             outputdomain = mmdfdomain;
  417.             break;
  418. # endif    F_MMDF
  419. # ifdef    F_TEXT
  420.         case    TEXT:
  421.             format_mask = M_TEXT;
  422.             outputformat = textformat;
  423.             /* Default to mixed case ! */
  424.             if (mixlow == UNSET) mixlow = MIXED;
  425.             break;
  426. # endif    F_TEXT
  427. # ifdef    F_VMS5
  428.         case    VMS5:
  429.             format_mask = M_VMS5;
  430.             outputm4rec = vms5m4rec;
  431.             /* Default to mixed case ! */
  432.             if (mixlow == UNSET) mixlow = MIXED;
  433.             break;
  434. # endif    F_VMS5
  435. # ifdef    F_VMS4
  436.         case    VMS4:
  437.             format_mask = M_VMS4;
  438.             outputm4rec = vms4m4rec;
  439.             /* Default to mixed case ! */
  440.             if (mixlow == UNSET) mixlow = MIXED;
  441.             break;
  442. # endif    F_VMS4
  443. # ifdef    F_SENDMAIL
  444.         case    SENDMAIL:
  445.             format_mask = M_SENDMAIL;
  446.             outputformat = sendmailformat;
  447.             outputdomain = sendmaildomain; break;
  448. # endif    F_SENDMAIL
  449. # ifdef    F_YORK21
  450.         case    YORK21:
  451.             format_mask = M_YORK21;
  452.             outputm4rec = york21m4rec;
  453.             if( --n > 0)
  454.             {
  455.                 if( stripoff )
  456.                     free(stripoff);
  457.                 stripoff = strdup(*++av);
  458.             }
  459.             break;
  460. # endif    F_YORK21
  461. # ifdef    F_DBM1
  462.         case    DBM1:
  463.             format_mask = M_DBM1;
  464.             outputm4rec  = dbm1m4rec;
  465.             outputformat = dbm1format;
  466.             outputdomain = dbm1domain;
  467.             break;
  468. # endif    F_DBM1
  469. # ifdef    F_PRIME
  470.         case    PRIME:
  471.             format_mask = M_PRIME;
  472.             outputformat = primeformat;
  473.             outputdomain = primedomain;
  474.             break;
  475. # endif    F_PRIME
  476. # ifdef    F_EDTEXT
  477.         case    EDTEXT:
  478.             format_mask = M_EDTEXT;
  479.             outputm4rec  = edtextm4rec;
  480.             outputdomain = edtextdomain;
  481.             if (mixlow == UNSET) mixlow = MIXED;
  482.             if (options & O_ED_MASK)
  483.             {    warn0(1, "Old type being ignored");
  484.                 options &= ~O_ED_MASK;
  485.             }
  486.             while ( --n > 0)
  487.             {
  488.                 if (!strcmp("simple", *++av))
  489.                     options |= O_ED_SIMPLE;
  490.                 else if (!strcmp("short", *av))
  491.                     options |= O_ED_SHORT;
  492.                 else if (!strcmp("long", *av))
  493.                     options |= O_ED_LONG;
  494.                 else if (!strcmp("standard", *av))
  495.                     options |= O_ED_LONG;
  496.                 else
  497.                     warn1(1, "Expecting edtext option \"simple\", \"short\" or \"long\", but found \"%s\"", *av);
  498.             }
  499.             if (!(options & O_ED_MASK)) options = O_ED_DEFAULT;
  500.             if ((options & O_ED_SIMPLE) &&
  501.                 (options & (O_ED_SHORT | O_ED_LONG)))
  502.             {    warn0(1, "\"simple\" is mutually exclusive to \"short\" and \"long\" -- simple ignored");
  503.                 options &= ~O_ED_SIMPLE;
  504.             }
  505.  
  506.             break;
  507. # endif    F_EDTEXT
  508.  
  509. # ifdef    F_VME
  510.         case    VME:
  511.             format_mask = M_VME;
  512.             outputm4rec  = vmem4rec;
  513.             outputdomain = vmedomain;
  514.             break;
  515. # endif    F_VME
  516.  
  517. # ifdef    F_PP
  518.         case    PP:
  519.             format_mask = M_PP;
  520.             outputm4rec  = ppm4rec;
  521.             /* outputformat  = ppformat; */
  522.             outputdomain = ppdomain;
  523.             break;
  524. # endif    F_PP
  525.         default:
  526.             warn1(1, "%s not recognised", *av);
  527.             break;
  528.     }
  529.  
  530. }
  531.  
  532. static_f int
  533. split(buffer, argv, nargs)    /* split up into argv vector (inplace) */
  534. char    *buffer;
  535. char    **argv;
  536. int    nargs;
  537. {
  538.     register char    *src;
  539.     register    int    ind = 0;
  540.  
  541.     for(argv[ind++] = src = buffer; *src && ind < nargs; src ++)
  542.     {
  543.         if( isspace(*src) )
  544.         {
  545.             *src++ = '\0';
  546.             while( isspace(*src))
  547.                 src++;
  548.             if( *src && *src != '#')
  549.                 argv[ind++] = src;
  550.             else    break;
  551.         }
  552.     }
  553.     return ind;
  554. }
  555.  
  556. # ifdef MULT_OUTPUT_FILES
  557.  
  558. /*
  559.  * Line is of the format
  560.  *
  561.  *    filename    abbreviated    standard    [local|?]
  562.  */
  563. static_f void
  564. file_dmn(av, n) /* set up domain->file mapping etc. */
  565. char    **av;
  566. int    n;
  567. {
  568.     File_list    *filep;
  569.  
  570.     if( n < 1 )
  571.     {
  572.         fatal0("botch on multiple domain files, no arguments");
  573.         return;
  574.     }
  575.     for(filep = fil_list; filep->fname != 0; filep++)
  576.         ;
  577.     if( filep - fil_list > MAXDOMAINS)
  578.         fatal1("too many channels/domains at %s !", *av);
  579.     filep->fname = strdup(*av);
  580.     n --; av++;
  581.     if( n < 1)
  582.         filep->dname = "";
  583.     else    filep->dname = strdup(*av);
  584.     n --; av++;
  585.     if( n < 1)
  586.         filep->ldname = filep->dname;
  587.     else    filep->ldname = strdup(*av);
  588.     filep->net = 0;
  589.     n --; av ++;
  590.     if( n < 1 || ! lexequ("local", *av, 5) )
  591.         filep->flags &= ~LOCAL;
  592.     else    filep->flags |= LOCAL;
  593. }
  594.  
  595. /*
  596.  * Line is of the format
  597.  *
  598.  *    filename    network        to.be.stripped
  599.  */
  600. static_f void
  601. file_chan(av, n)
  602. char    **av;
  603. int    n;
  604. {
  605.     File_list    *filep;
  606.  
  607.     if( n < 2 )
  608.     {
  609.         fatal0("botch on multiple channel file, no arguments");
  610.         return;
  611.     }
  612.     for(filep = fil_list; filep->fname != 0; filep++)
  613.         ;
  614.     if( filep - fil_list > MAXDOMAINS)
  615.         fatal1("too many channels/domains at %s !", *av);
  616.     filep->fname = strdup(*av);
  617.     filep->dname = filep->ldname = "";
  618.     n --; av++;
  619.     if( (filep->net = slookup(*av, netnames)) == -1)
  620.         fatal1("Unknown network %s", *av);
  621.     n --; av++;
  622.     if ( n > 0)
  623.         filep->dname = strdup(*av);
  624. }
  625. # endif MULT_OUTPUT_FILES
  626. void
  627. static_f setgateway(av, n)
  628. char    **av;
  629. int    n;
  630. {
  631.     if( n < 2)
  632.     {
  633.         warn1(1, "Ill formed gateway config %s", *av);
  634.         return;
  635.     }
  636.  
  637.     switch(slookup(*av, gateways))
  638.     {
  639.         case    G_PSS:
  640.             if( pssgateway )
  641.                 free(pssgateway);
  642.             pssgateway = strdup(*++av);
  643.             break;
  644.         case    G_JANET:
  645.             if( janetgateway )
  646.                 free(janetgateway);
  647.             janetgateway = strdup(*++av);
  648.             break;
  649.         default:
  650.             warn1(1, "Unknown gateway %s", *av);
  651.             break;
  652.     }
  653. }
  654.  
  655. static_f void
  656. config_check()
  657. {
  658.     if ((longshort == LONG || longshort == SHORT) && format_mask &
  659.         (M_YORK|M_X25HOSTS|M_SMAIL|M_VMS4|M_VMS5|M_YORK21|M_PRIME|M_EDTEXT|M_VME))
  660.         warn0(1, "long/short should not be set");
  661.     if ((forwrev == REVERSE || forwrev == FORWARD) && format_mask &
  662.         (M_X25HOSTS|M_MMDF|M_SENDMAIL|M_VMS4|M_VMS5|M_EDTEXT))
  663.         warn0(1, "forward/reverse should not be set");
  664.     if ((mixlow == MIXED || mixlow == LOWER) && format_mask &
  665.         (M_PRIME|M_YORK|M_X25HOSTS|M_MMDF|M_SMAIL|M_YORK21|M_DBM1|M_VME))
  666.         warn0(1, "mixed/lower should not be set");
  667.     if ((ignore_relay) && format_mask &
  668. (M_YORK|M_X25HOSTS|M_MMDF|M_TEXT|M_SMAIL|M_SENDMAIL|M_YORK21|M_DBM1|M_PRIME|M_EDTEXT|M_VME))
  669.         warn0(1, "ignore_relay should not be set");
  670.     if ((DOMfile) && format_mask &
  671.         (M_YORK|M_X25HOSTS|M_TEXT|M_SMAIL|M_VMS4|M_VMS5|M_YORK21|M_PRIME))
  672.         warn0(1, "domain file should not be set");
  673. #ifdef    MULT_OUTPUT_FILES
  674.     if ((relay_host) && format_mask &
  675. (M_YORK|M_X25HOSTS|M_TEXT|M_SMAIL|M_SENDMAIL|M_VMS4|M_VMS5|M_YORK21|M_DBM1|M_PRIME|M_EDTEXT|M_VME))
  676.         warn0(1, "relay host should not be set");
  677. #endif    MULT_OUTPUT_FILES
  678.     if (hostname && format_mask &
  679.         (M_TEXT|M_SMAIL|M_SENDMAIL|M_DBM1|M_PRIME))
  680.         warn0(1, "hostname should not be set");
  681.     if (commentfile && format_mask &
  682.         (M_TEXT|M_SMAIL|M_SENDMAIL|M_DBM1|M_PRIME))
  683.         warn0(1, "commentfile should not be set");
  684. #ifdef    MULT_OUTPUT_FILES
  685.     if ((fil_list[0].fname) && format_mask &
  686. (M_YORK|M_X25HOSTS|M_TEXT|M_SMAIL|M_VMS4|M_VMS5|M_YORK21|M_DBM1|M_PRIME|M_EDTEXT|M_VME))
  687.         warn0(1, "domain/channel file should not be set");
  688. #endif    MULT_OUTPUT_FILES
  689.     if ((pssgateway || janetgateway) && format_mask &
  690.         (M_X25HOSTS|M_MMDF|M_SENDMAIL|M_TEXT|M_VMS4|M_VMS5|M_DBM1|M_PRIME|M_EDTEXT|M_VME))
  691.         warn0(1, "pss/janet gateway should not be set");
  692.     if (format_mask &
  693.         (M_PRIME|M_VME))
  694.         mixlow = MIXED;
  695. }
  696.